package api

import (
	"chaincode/model"
	"chaincode/pkg/utils"
	"encoding/json"
	"fmt"
	"strconv"

	"github.com/hyperledger/fabric/core/chaincode/shim"
	pb "github.com/hyperledger/fabric/protos/peer"
)

// CreateItem 新建Item
func CreateItem(stub shim.ChaincodeStubInterface, args []string) pb.Response {
	// 验证参数
	if len(args) != 8 {
		return shim.Error("参数个数不满足")
	}
	poster := args[0] //accountId用于验证是否为管理员
	taker := args[1]
	posterImg := args[2]
	takerImg := args[3]
	title := args[4]
	description := args[5]
	price := args[6]
	option := args[7]
	if poster == "" || title == "" || price == "" || option == "" {
		return shim.Error("参数存在空值")
	}
	// 参数数据格式转换
	var formattedPrice float64
	if val, err := strconv.ParseFloat(price, 64); err != nil {
		return shim.Error(fmt.Sprintf("price参数格式转换出错: %s", err))
	} else {
		formattedPrice = val
	}
	var formattedOption bool
	if val, err := strconv.ParseBool(option); err != nil {
		return shim.Error(fmt.Sprintf("livingSpace参数格式转换出错: %s", err))
	} else {
		formattedOption = val
	}
	resultsPoster, err := utils.GetStateByPartialCompositeKeys(stub, model.AccountKey, []string{poster})
	if err != nil || len(resultsPoster) != 1 {
		return shim.Error(fmt.Sprintf("poster信息验证失败%s", err))
	}
	item := &model.Item{
		ItemID:      stub.GetTxID()[:16],
		Poster:      poster,
		Taker:       taker,
		PosterImg:   posterImg,
		TakerImg:    takerImg,
		Title:       title,
		Description: description,
		Price:       formattedPrice,
		Option:      formattedOption,
		Encumbrance: false,
	}
	// 写入账本
	if err := utils.WriteLedger(item, stub, model.ItemKey, []string{item.Poster, item.ItemID}); err != nil {
		return shim.Error(fmt.Sprintf("%s", err))
	}
	//将成功创建的信息返回
	itemByte, err := json.Marshal(item)
	if err != nil {
		return shim.Error(fmt.Sprintf("序列化成功创建的信息出错: %s", err))
	}
	// 成功返回
	return shim.Success(itemByte)
}

// QueryItem 查询捐赠(可查询所有，也可根据所有人查询名下捐赠)
func QueryItem(stub shim.ChaincodeStubInterface, args []string) pb.Response {
	var itemList []model.Item
	results, err := utils.GetStateByPartialCompositeKeys2(stub, model.ItemKey, args)
	if err != nil {
		return shim.Error(fmt.Sprintf("%s", err))
	}
	for _, v := range results {
		if v != nil {
			var item model.Item
			err := json.Unmarshal(v, &item)
			if err != nil {
				return shim.Error(fmt.Sprintf("QueryItem-反序列化出错: %s", err))
			}
			itemList = append(itemList, item)
		}
	}
	itemListByte, err := json.Marshal(itemList)
	if err != nil {
		return shim.Error(fmt.Sprintf("QueryItem-序列化出错: %s", err))
	}
	return shim.Success(itemListByte)
}

// UpdItem 更新Item(添加Taker&&TakerImg)
func UpdItem(stub shim.ChaincodeStubInterface, args []string) pb.Response {
	// 验证参数
	if len(args) != 4 {
		return shim.Error("参数个数不满足")
	}
	poster := args[0]
	itemID := args[1] //args[0] && args[1] 作为key
	taker := args[2]
	takerImg := args[3]
	// if poster == "" || itemID == "" || taker == "" {
	// 	return shim.Error("参数存在空值")
	// }
	// 参数数据格式转
	resultsPoster, err := utils.GetStateByPartialCompositeKeys(stub, model.AccountKey, []string{poster})
	if err != nil || len(resultsPoster) != 1 {
		return shim.Error(fmt.Sprintf("poster信息验证失败%s", err))
	}
	// resultsTaker, err := utils.GetStateByPartialCompositeKeys(stub, model.AccountKey, []string{taker})
	// if err != nil || len(resultsTaker) != 1 {
	// 	return shim.Error(fmt.Sprintf("taker信息验证失败%s", err))
	// }
	resultsItem, err := utils.GetStateByPartialCompositeKeys2(stub, model.ItemKey, []string{poster, itemID})
	if err != nil || len(resultsItem) != 1 {
		return shim.Error(fmt.Sprintf("根据%s和%s获取销售信息失败: %s", poster, itemID, err))
	}
	var item model.Item
	if err = json.Unmarshal(resultsItem[0], &item); err != nil {
		return shim.Error(fmt.Sprintf("updItem-反序列化出错: %s", err))
	}
	item.Taker = taker
	item.TakerImg = takerImg
	// 将修改后的item写入账本
	if err := utils.WriteLedger(item, stub, model.ItemKey, []string{item.Poster, item.ItemID}); err != nil {
		return shim.Error(fmt.Sprintf("%s", err))
	}
	//将成功创建的信息返回
	// return shim.Error(fmt.Sprintf("%s", item.Poster+item.Taker+item.ItemID))
	itemByte, err := json.Marshal(item)
	if err != nil {
		return shim.Error(fmt.Sprintf("序列化成功创建的信息出错: %s", err))
	}
	// 成功返回

	return shim.Success(itemByte)
}
